For data storage applications, it is imperative to use error correcting codes (ECC) to provide data integrity. Low density parity check codes (LDPC) and Bose-Chaudhuri-Hocquenghem (BCH) codes are most commonly used for ECC in data storage applications. Use of product codes (e.g., turbo product codes, generalized product codes, and the like) for storage applications has recently been proposed. Product codes have several advantages over LDPC and BCH codes in terms of hardware complexity. However, there is a need in the art to improve soft decoding performance of these codes.